package Coding.Th;

/**
 *
 * 同步线程
 *
 * 线程提供的方法 join,可以协调线程的同步运行
 * 多线程是并发运行, 本身是一种异步运行的状态
 * 异步: 各执行各的
 * 同步: 多个线程执行是存在先后顺序的
 *
 *线程提供的方法:join,可以协调线程的同步运行
 *
 * 显示带有图片的网页时,涉及两条线程:
 *  * 1:下载线程 下载图片
 *  * 2:显示线程 显示文字,显示图片
 *  * 最开始,下载线程和显示线程是异步的,各自干各自,
 *  * 但是当显示线程显示文字结束,显示图片时,发现图片还没有下载完毕,
 *  * 此时显示线程应该进入阻塞状态,等待图片下载完毕时,再显示图片,此时是同步状态
 *
 *
 */
public class ThreadJoin {
   //两个线程 各干各的
    static boolean isDownload = false; //静态变量 不能调用非静态的 false表示图片没有下载完
    public static void main(String[] args) {

        Thread t1 = new Thread("下载线程") {

            @Override
            public void run() {
                System.out.println("正在下载图片");


                for (int i = 0; i < 100; i++) {
                    System.out.println("图片已经下载" + i + "%");

                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
                System.out.println(getName() + "图片下载完毕!!!");
                isDownload=true;
            }
        };


        Thread t2 = new Thread("显示线程") {

            @Override
            public void run() {
                System.out.println(getName() + "显示文字");


                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(getName() + "文字显示完毕");

                //由于图片还没有下载完毕, 需要让显示进程进入堵塞状态.等待下载线程执行完毕  join 插队

                try {
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


                System.out.println(getName() + "开始显示图片");
                if (!isDownload){
                    throw  new RuntimeException("图片加载失败"); //程序结束   了
                }
                System.out.println(getName() + "图片显示完了");

            }
        };

        t1.start();
        t2.start();
    }
}
